package initializer

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"log"
	"sgo/scontext"
)

type GormInitializer struct {
}

func (GormInitializer) initialize(sc *scontext.SgoContext) error {
	// mysql配置
	mysqlConfig := mysql.Config{
		DSN:                       sc.ViperConfig.Mysql.Dsn, // DSN data source name
		DefaultStringSize:         255,                      // string 类型字段的默认长度
		DisableDatetimePrecision:  true,                     // 禁用 datetime 精度，MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true,                     // 重命名索引时采用删除并新建的方式，MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true,                     // 用 `change` 重命名列，MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false,                    // 根据版本自动配置
	}

	// grom配置
	gormConfig := &gorm.Config{
		SkipDefaultTransaction:                   false, //对于写操作（创建、更新、删除），为了确保数据的完整性，GORM 会将它们封装在事务内运行。但这会降低性能，你可以在初始化时禁用这种方式
		DisableForeignKeyConstraintWhenMigrating: true,
		// GORM 会自动创建外键约束，若要禁用该特性，可将其设置为 true
	}

	if db, err := gorm.Open(mysql.New(mysqlConfig), gormConfig); err != nil {
		log.Println("连接MYSQL数据库失败:", err)
		return err
	} else {
		// 连接池配置
		sqlDB, err := db.DB()
		if err != nil {
			log.Println("连接MYSQL数据库失败:", err)
			return err
		}
		sqlDB.SetMaxIdleConns(sc.ViperConfig.Mysql.MaxIdleConns)
		sqlDB.SetMaxOpenConns(sc.ViperConfig.Mysql.MaxOpenConns)
		log.Println("连接MYSQL数据库成功")
		sc.DB = db
	}
	return nil
}
